/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.bld.model.perfil;

import br.com.bld.util.facade.AbstractBe;
import br.com.bld.util.facade.BLDDataErro;
import br.com.bld.util.facade.EntityFactory;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.HashMap;

/**
 *
 * @author Pedro
 */
public class PerfilBe extends AbstractBe implements BLDDataErro {

    private final PerfilDao dao;

    public PerfilBe() throws SQLException {
        super();

        dao = createDao();
    }

    public PerfilBe(Connection conn) throws SQLException {
        super(conn);

        dao = createDao();
    }

    private PerfilDao createDao() {

        String table = "bldtb12_perfil";

        String[] fields = {
            "id",
            "bldtb11_id",
            "desc_perfil"
        };

        String[] pk = {"id"};

        String sequece = "bldtb12_perfil_id_seq";

        return new PerfilDao(conn, new EntityFactory(conn, table, fields, pk, sequece));
    }

    public int inserir(PerfilEntity entity, Long usuarioId) throws SQLException {

        if (entity == null) {
            throw new IllegalArgumentException(String.format(PARM_NAO_INFORMADO, PerfilEntity.CLASS_ID));
        }

        int resposta = dao.insert(entity, new PerfilPK(proximoId(), usuarioId));

        commit();

        return resposta;
    }

    public PerfilEntity selecionar(PerfilPK pk) throws SQLException {

        if (pk == null) {
            throw new IllegalArgumentException(String.format(PARM_NAO_INFORMADO, PerfilPK.CLASS_ID));
        }

        return dao.selectByPk(pk);
    }

    public int atualizar(PerfilEntity entity, PerfilPK pk) throws SQLException {

        if (entity == null) {
            throw new IllegalArgumentException(String.format(PARM_NAO_INFORMADO, PerfilEntity.CLASS_ID));
        }

        if (selecionar(pk) == null) {
            throw new IllegalArgumentException(REGT_NAO_LOCALIZADO);
        }

        int resposta = dao.update(entity, pk);

        commit();

        return resposta;
    }

    public int apagar(PerfilPK pk) throws SQLException {

        if (pk == null) {
            throw new IllegalArgumentException(String.format(PARM_NAO_INFORMADO, PerfilPK.CLASS_ID));
        }

        if (selecionar(pk) == null) {
            throw new IllegalArgumentException(REGT_NAO_LOCALIZADO);
        }

        int resposta = dao.delete(pk);

        commit();

        return resposta;
    }

    public HashMap<PerfilPK, PerfilEntity> selecionarTodos() throws SQLException {
        return dao.selectAll();
    }

    public HashMap<PerfilPK, PerfilEntity> selecionarPaginacao(Integer numrPagina, Integer qtdePorPagina) throws SQLException {

        if (numrPagina == null) {
            throw new IllegalArgumentException(String.format(PARM_NAO_INFORMADO, "Número da Página"));
        }
        if (numrPagina == null) {
            throw new IllegalArgumentException(String.format(PARM_NAO_INFORMADO, "Quantidade por Página"));
        }

        return dao.selectByPage(numrPagina, qtdePorPagina);
    }

    private Long proximoId() throws SQLException {
        return dao.nextSequeceValue();
    }
}
